module InstrMem (addr_a, out_a, reset);
  parameter word_size=32;
  parameter addr_size=32;

  parameter mem_size=16;
  parameter MEM_BOUND=32'h0000_0010;

  //instruction memory is implemented as a 16-word storage, 64 byte
  //a read-only memory(ROM)

  input reset;
  input [addr_size-1:0] addr_a;
  output [word_size-1:0] out_a; //output memory data from

  reg out_a;

  //internal storage
  reg [word_size-1:0] storage [mem_size-1:0];

  //instructions pre-loaded into memory for the instructions
  always @ (reset) begin
    if(reset==1'b1) begin
      `include "samples/test_3.v"
    end
  end



  always @ (addr_a) begin
    //check bounds
      if(addr_a < MEM_BOUND) begin
          out_a<=storage[addr_a];
      end
      else begin
          $display("Instr Mem--Bad R Address:%x, Out of Bound %x", addr_a, MEM_BOUND);
          out_a<=32'b0; //remove uncertainty, default return nop
      end
end
endmodule // InstrMem

// module instr_mem_sim ();
//   parameter word_size=32;
//   parameter addr_size=32;
//
//   wire [word_size-1:0] out_a;
//   reg [addr_size-1:0] addr_a;
//   reg reset;
//
//
//   InstrMem instr_mem(addr_a, out_a, reset);
//
//   initial begin
//     $dumpfile("instr_mem_sim.vcd");
//     $dumpvars(0,instr_mem_sim);
//
//     //register monitor
//     $display("Time\tAddr_a\tOut_a\tReset");
//     $monitor("%g\t%x\t%x\t%x",$time, addr_a, out_a, reset);
//
//     //init registers
//     addr_a=32'h0000_00F0;
//     reset=0;
//
//
//     #1 reset=1;
//     #1 addr_a=32'h0000_0000;
//     //test normal read
//     #2 addr_a=32'h0000_0004;
//     //test out of bound read
//     #1 addr_a=32'h0000_0040;
//     #1 $finish;
//
//
//
//
//   end
//
// endmodule // simulator for data memory
